#pragma once

#include "noncopyable.h"
#include "Socket.h"
#include "Channel.h"

#include <functional>

class EventLoop;
class InetAddress;

/**
 *     Acceptor负责创建一个监听套接字，并在新的TCP连接到达时接受这些连接。通过Channel和EventLoop，
 * 它能将新连接的处理委托给相应的处理函数，从而实现非阻塞IO和事件驱动。
*/

// Acceptor类用于接受新的TCP连接，并通过回调处理这些连接。
class Acceptor : noncopyable
{
public:
    // 定义回调类型, 当有新连接时调用
    // 轮询找到subLoop，唤醒，分发当前的新客户端的Channel
    using NewConnectionCallback = std::function<void(int sockfd, const InetAddress&)>;

    Acceptor(EventLoop *loop, const InetAddress &listenAddr, bool reuseport);
    ~Acceptor();

    // 设置新连接的回调函数
    void setNewConnectionCallback(const NewConnectionCallback &cb) 
    {
        newConnectionCallback_ = cb;
    }

    // 检查是否正在监听
    bool listenning() const { return listenning_; }
    void listen(); // 开始监听
private:
    void handleRead();
    
    EventLoop *loop_; // Acceptor用的就是用户定义的那个baseLoop，也称作mainLoop
    Socket acceptSocket_; // 用于接受连接的套接字
    Channel acceptChannel_; // 与acceptSocket_关联的通道，用于处理IO事件
    NewConnectionCallback newConnectionCallback_; // 新连接到达时调用的回调
    bool listenning_;
};
